package study.eggs.async.mdc.task;

import org.slf4j.MDC;

import java.util.Map;

public class MdcRunnable implements Runnable {

    private Runnable delegate;
    /* MDC 上下文 */
    private final Map<String, String> contextMap;

    public MdcRunnable(Runnable task) {
        this.delegate = task;
        //获取父线程 MDC 中的内容，必须在 run 方法之前，
        //否则等异步线程执行的时候有可能 MDC 里面的值已经被清空了，这个时候就会返回 null
        this.contextMap = MDC.getCopyOfContextMap();
    }

    @Override
    public void run() {
        //将父线程的 MDC 内容传给子线程
        MDC.setContextMap(contextMap);
        try {
            //执行异步操作
            delegate.run();
        } finally {
            //清空 MDC 内容
            MDC.clear();
        }
    }
}
